#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=100005;
struct node
{
	ll l,r;
	ll sum,add;
}tr[N*4];
ll a[N];
ll n,m;
void pushup(ll u)
{
	tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
}
void pushdown(ll u)
{
	auto &root=tr[u],&left=tr[u<<1],&right=tr[u<<1|1];
	if(root.add)
	{
		left.add+=root.add,left.sum+=(ll)(left.r-left.l+1)*root.add;
		right.add+=root.add,right.sum+=(ll)(right.r-right.l+1)*root.add;
		root.add=0;
	}
	
}
void build(ll u,ll l,ll r)
{
	tr[u]={l,r};
	if(l==r) 
	{
		tr[u].sum=a[l];
		return;
	}
	ll mid=l+r>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	pushup(u);
}
void modify(ll u,ll l,ll r,ll add)
{
	if(tr[u].l>=l && tr[u].r<=r)
	{
		
		tr[u].sum+=(ll)(tr[u].r-tr[u].l+1)*add;
		tr[u].add+=add;
		return;
	}
	pushdown(u);
	ll mid=tr[u].l+tr[u].r>>1;
	if(l<=mid) modify(u<<1,l,r,add);
	if(r>mid) modify(u<<1|1,l,r,add);
	pushup(u);
	
}
ll query(ll u,ll l,ll r)
{
	if(tr[u].l>=l && tr[u].r<=r) return tr[u].sum;
	else
	{
		pushdown(u);
		ll mid=tr[u].l+tr[u].r>>1;
		ll sum=0;
		if(l>=mid) sum=query(u<<1,l,r);
		if(r>mid)  sum+=query(u<<1|1,l,r);
		return sum;
		
		
		
	}
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);	
	}
	build(1,1,n);
   while(m--)
   {
   	int x;
   	cin>>x;
   	if(x==1)
   	{
	   	int b,c,d;
	   	cin>>b>>c>>d;
	   	modify(1,b,c,d);
	}
	else
	{
		int b,c;
		cin>>b>>c;
		printf("%lld\n",query(1,b,c));
		
	}
   }
	return 0;
}
